package com.liziba.mq.topic.provider.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @auther LiZiBa
 * @date 2021/1/31 23:34
 * @description: 主题交换机
 **/
@Configuration
public class TopicRabbitConfig {

    // 主题键
    private static final String LOGGER_INFO = "logger.info";
    private static final String LOGGER_ERROR = "logger.error";

    /**
     * 创建名称为logger.info队列
     * @return
     */
    @Bean
    public Queue queueInfo() {
        // 队列名称
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        return new Queue(TopicRabbitConfig.LOGGER_INFO, true, false, false);
    }

    /**
     * 创建名称为logger.error队列
     * @return
     */
    @Bean
    public Queue queueError() {
        return new Queue(TopicRabbitConfig.LOGGER_ERROR, true, false, false);
    }

    /**
     * 创建名称为TopicExchange的交换机
     * @return
     */
    @Bean
    public TopicExchange exchange() {
        return new TopicExchange("TopicExchange", true, false);
    }

    /**
     * 绑定queueInfo队列 和 TopicExchange交换机
     * 将消息路由key携带logger的消息发至queueInfo队列
     * @return
     */
    @Bean
    public Binding bindingInfoAndErrorExchangeMessage() {
        return BindingBuilder.bind(queueInfo()).to(exchange()).with("logger.*");
    }

    /**
     * 绑定queueError队列 和 TopicExchange交换机
     * 将消息路由固定为logger.error的消息发送至queueError队列
     * @return
     */
    @Bean
    public Binding bindingErrorExchangeMessage() {
        return BindingBuilder.bind(queueError()).to(exchange()).with("logger.error");
    }

}
